#ifndef LINK
#define LINK
#include<iostream>
#include<cstdlib>
#include"node.cpp"
using namespace std;

template<class T>
class List
{

	private:
		Node<T>*  head;
		Node<T> * rear;
		int len;

		Node<T> * getRear();
	public:
		List(){head=rear=NULL;len=0;}
//		List(int len);
		List(const List<T> & l);
		~List(){}
		
		int getLen() const;
		int isEmpty() const;
	//	T* next();
		void insertFront(T & t);
		void insertRear(T & t);
		void insertAt(T & t);
		void insertAfter(T & t);
		T * deleteFront();
		T * deleteRear();
//		void deleteAt();

		void clearList();

		void display();
		void add(){}
	
};

template <class T>
void List<T>::display()
{
	Node<T>*  cur=head;
	for(int i=0;i<len;i++)
	{
		cur->display();
		cur=cur->next;
	}
		
}

template <class T>
int List<T>::getLen() const
{
	return len;
}


template <class T>
void List<T>::clearList()
{
	Node<T> * temp;
	for(int i=0;i<len;i++)
	{
		temp=head;
		head=head->next;
		delete temp;
	}
}


template <class T>
int List<T>::isEmpty() const
{
	if (len <=0)
		return 1;
	else
		return 0;
}


template <class T>
void List<T>::insertFront(T & t)
{
	Node<T> * n=new Node<T>(t);
	if(head==NULL)
	{
		head=rear=n;
	}
	else
	{
		n->next=head;
		head=n;
	}
	len+=1;
}



template <class T>
void List<T>::insertRear(T & t)
{
	Node<T> * n=new Node<T>(t);

	if(rear==NULL)
	{
		head=rear=n;
	}
	else
	{
		rear->next=n;
		rear=n;
	}
	len+=1;
}

template <class T>
void List<T>::insertAfter(T & t) 
{}

template <class T>
void List<T>::insertAt(T & t)
{}


template <class T>
T* List<T>::deleteFront()
{
	Node<T>* temp =new Node<T> ();
	if(NULL==head)
		return NULL;
	else
	{
		temp=head;
		head=head->next;
		return temp->value;
	}
}

template <class T>
T * List<T>::deleteRear()
{
	Node<T> * temp=new Node<T> ();
	if(NULL==rear)
	{
		return NULL;
	}
	else
	{
		temp=rear;
		rear=getRear();
		return temp->value;
	}
}

template <class T>
Node<T> * List<T>::getRear()
{
	Node<T> * c=head;
	if(NULL==c)
		return NULL;
	else
	{
		while(NULL!=c)
			c=c->next;
		return c;
	}
}

#endif
